package main

import (
"sync"
"sync/atomic"
)

// 并行
func AddConcurrent(goroutines int, numbers []int) int {
	// 声明一个整型
	var total int64
	// 切片的长度
	totalNumbers  := len(numbers)
	// 最后一个协程的索引
	lastGoroutine := goroutines - 1
	// 将需要相加的所有数字分组,比如5个元素,2个协程,这里就可以分为2组,第一组索引0 1  第二组索引2 3 4
	stride := totalNumbers / goroutines
	// 同步
	var wg sync.WaitGroup
	// 收集协程个数
	wg.Add(goroutines)
	// 开始统计
	for g := 0; g < goroutines; g++ {
		go func(g int) {
			start := g * stride
			end   := start + stride
			if g  == lastGoroutine {

				end = totalNumbers

			}
			// 每一组元素的和
			var lv int
			for _, n := range numbers[start:end] {
				lv += n
			}
			atomic.AddInt64(&total, int64(lv))
			wg.Done()
		}(g)
	}
	wg.Wait()
	return int(total)
}

// 串行
func AddNormal(numbers []int) int64 {
	var total int64
	for  _,val := range numbers{

		total += int64(val)

	}
	return total
}

